<?
function buycard_open_payment()
	{
		//	
		$msgs	= array();
		$msg	= "";
		$code 	= -1;
		$Coin	= "";
		if(isset($_SESSION['pay']['store_info_init']))
		{			
			$pay_store_info_init = $_SESSION['pay']['store_info_init'];
			//print_r($pay_store_info_init);exit;
			// GET VALUE FROM SESSION
			$data['catID'] 			= $pay_store_info_init['catID'];
			$data['provider'] 		= $pay_store_info_init['provider'];
			$data['productID']		= $pay_store_info_init['productID'];
			$data['quantity']		= $pay_store_info_init['quantity'];
			$data['cardprice']		= $pay_store_info_init['cardprice'];
			$data['paymethod']		= $pay_store_info_init['paymethod'];	
		}				
		// Check catID,ProviderID,Product ID valid.		
		$tmp3					= $this->db_user_model->checkCardProduct($data['productID']);
		if(!$tmp3){
			$code 		= -1;
			$msgs[] 	= "Thông tin mua thẻ không hợp lệ.";
		}		
		// Get Card Info
		$card_info				= $this->db_user_model->getCardProductsInfo($data['productID']);		
		if(!$card_info){
			$code 		= -1;
			$msgs[] 	= "Thông tin mua thẻ không hợp lệ.1.0.";
		}		                
		// Get user info
		$user_info = $this->session->userdata('user_info');
		// Nếu chưa login thì redirect qua form nhập thông tin.		
		if(!$user_info){
                    if(isset($_SESSION['pay']['store_info_init']['Email'])){
                        $Email      = $_SESSION['pay']['store_info_init']['Email'];                        
                        $user_info  = $this->db_user_model->getUserByEmail($Email);                        
                        if($user_info){
                            $uID 			= $user_info[0]->uID;
                            $username                   = $user_info[0]->username;
                            $customerID                 = $user_info[0]->customerID;
                            $email 			= $user_info[0]->email;	                            
                        }else{
                            $code 		= -1;
                            $msgs[]             = "Thông tin tài khoản không hợp lệ.1.0";			
                        }                            
                    }			
		}else{ // else thì check số tiền trong ví.
                    $uID 			= $user_info[0]->uID;
                    $username                   = $user_info[0]->username;
                    $customerID                 = $user_info[0]->customerID;
                    $email 			= $user_info[0]->email;	
		}
		// code here
		/////////////////////////////////////	
		$log_init					= "";// khởi tạo dữ liệu			
		$log_init['ip'] 			= get_real_ip();
		$log_init['created'] 		= time();
		$log_init['date'] 			= date("Y-m-d H:i:s");
		$log_init['transID'] 		= TRANSID_MUATHE.$data['productID']."_".$data['quantity']."_".$log_init['created'];
		$log_init['catID'] 			= $data['catID'];
		$log_init['provider'] 		= $data['provider'];
		$log_init['productID'] 		= $data['productID'];
		$log_init['productValue'] 	= $card_info[0]->productName;
		$log_init['quantity'] 		= $data['quantity'];
		$log_init['cardprice'] 		= $data['cardprice'];
		$log_init['paymethod']		= $data['paymethod'];
		$log_init['typeUse']		= TRANSID_TYPE_USE_MUATHE;
		// START - SAU KHI NẠP THẺ LẬP TỨC KHỞI TẠO LOG GIAO DỊCH CHO DÙ SAI HAY ĐÚNG.
		// E1.SAVE LOG KHỞI TẠO GIAO DỊCH TRƯỚC KHI ĐĂNG NHẬP VÀO EPAY
		$aParamCardLog=array(                                
				'uID' 			=> $uID,				
				'username'		=> $username,
				'email' 		=> $email,
				'customerID' 	=> $customerID,
				'transID' 		=> $log_init['transID'],
				'catID' 		=> $log_init['catID'],
				'providerID'	=> $log_init['provider'],
				'productID' 	=> $log_init['productID'],
				'productValue' 	=> $log_init['productValue'],
				'quantity' 		=> $log_init['quantity'],
				'cardprice' 	=> $log_init['cardprice'],
				'typeUse' 		=> $log_init['typeUse'],
				"date"			=> $log_init['date'],
				'created' 		=> $log_init['created'],
				'statusDesc' 	=> "Khởi tạo",
				'status' 		=> "-2",
				'ip' 			=> $log_init['ip']
			);						
		if(!count($msgs)) {	
			// save log đợt 1
			$log1 					= $this->db_billing_model->ano_logbilling_init($aParamCardLog); //ok		
			// END - E1.SAU KHI NẠP THẺ LẬP TỨC KHỞI TẠO LOG GIAO DỊCH CHO DÙ SAI HAY ĐÚNG.
			//// GỌI THƯ VIỆN EPAY///////////////
			require_once(APPPATH.'libraries/pay/epay/ItopupClient.php');
			$itopupClient 			= new ItopupClient();
			// 1. Ðăng nhập hệ thống
			$result 				= $itopupClient->signIn();		
			////////////////////////////////
			// CHECK PRODUCT DETAIL STORE STATUS
			$cardStoreStatus		= $this->CheckProductsDetail($itopupClient,$data['productID'],$data['quantity']);
			// Kết quả sau khi đăng nhập.
			if($itopupClient->errorCode==0)
			{
				try
				{
					$errorCode			= $itopupClient->errorCode;// Ma 0: thanh cong
					$errorMessage		= $itopupClient->errorMessage;
					$errortoken			= $itopupClient->token;// Ma cua phien lam viec
					$requestID 			= $itopupClient->generateRandomRequestID();					
					// E2.START SAVE LOG KHỞI TẠO GIAO DỊCH SAU KHI LOGIN VÀO EPAY SYSTEM
					$aParamCardLog=array(
							'requestID' 	=> $requestID,
							'transID' 		=> $log_init['transID'],// key để biết được record sẽ updated
							'updated' 		=> date("Y-m-d H:i:s"),
							// card store info
							'errorCode' 	=> $cardStoreStatus['errorStoreCode'],
							'errorMessage' 	=> $cardStoreStatus['errorStoreMessage'],
							//
							'statusDesc' 	=> "Chưa hoàn thành",
							'status' 		=> "-1"
						);
					// update customer ID for user table
					$aUpdate		= array("requestID","updated","errorCode","errorMessage","statusDesc","status");
					$log2 			= $this->db_billing_model->insert_onduplicate_logbilling_update($aParamCardLog,$aUpdate); //ok
					// E2.END SAVE LOG KHỞI TẠO GIAO DỊCH SAU KHI LOGIN VÀO EPAY SYSTEM
								
					//////////////////////// GỌI HÀM LẤY MÃ THẺ//////////////////////
					$result				= $this->downloadSoftpin($itopupClient,$data['productID'],$data['quantity'],$requestID);
					// 1. Gửi kết quả về từ Epay
					// Epay trans ID info success
					if($result[1]['epayTransID']>0 && $result[1]['epayStatus']>0){ // có giao dịch và giao dịch hợp lệ						
						/////
						$i=0;
						$cardData_array["x"]			= "";
						$cardData_array["xserial"]		= "";
						$cardData_array["xcode"]		= "";
						$total							= count($result);
						// n mã thẻ được trả về.
						foreach ($result as $product)
						{
							++$i;
							// notice info							
							$purchase_res[$i]['epayTransID']		= $product["epayTransID"];
							$purchase_res[$i]['epayStatus']			= $product["epayStatus"];
							$purchase_res[$i]['errorCode']			= $product["errorCode"];
							$purchase_res[$i]['errorMessage']		= $product["errorMessage"];
							$purchase_res[$i]['requestID']			= $product["requestID"];
							// product info
							$purchase_res[$i]['categoryName']		= $product['categoryName'];
							$purchase_res[$i]['productID']			= $product['productID'];
							if($card_info)
							{
								$purchase_res[$i]['productValue']		= $card_info[0]->productName;//$product['productValue'];
								$purchase_res[$i]['providerID']			= $card_info[0]->providerID;//$product['productID'];
								//$purchase_res[$i]['providerName']		= $card_info[0]->providerName;//$product['productID'];
							}
							$purchase_res[$i]['serviceProviderName']= $product['serviceProviderName'];
							// user info
							if($user_info)
							{
								$purchase_res[$i]['customerID']			= $user_info[0]->customerID;
								$purchase_res[$i]['email']				= $user_info[0]->email;
							}
							// card info
							$purchase_res[$i]['softpinPinCode']		   	= $product['softpinPinCode'];
							$purchase_res[$i]['softpinSerial']		   	= $product['softpinSerial'];
							$purchase_res[$i]['expiryDate']				= $product['expiryDate'];
							$purchase_res[$i]['merchantBalance']		= $product["merchantBalance"];	
							if($i<$total)
							{
								$cardData_array["xserial"]				.= $product['softpinSerial']."@";
								$cardData_array["xcode"]				.= $product['softpinPinCode']."@";
								$cardData_array["x"] 				   	.= $product['softpinSerial']."@".$product['softpinPinCode'].";";
							}else{
								$cardData_array["xserial"]				.= $product['softpinSerial'];
								$cardData_array["xcode"]				.= $product['softpinPinCode'];
								$cardData_array["x"] 				   	.= $product['softpinSerial']."@".$product['softpinPinCode'];	
							}
							// E3.START SAVE LOG SUCCESS
							$aParamCardLog=array(
									'transID' 		=> $log_init['transID'],// key để biết được record sẽ updated
									'epayStatus' 	=> $purchase_res[$i]['epayStatus'],
									'partnerTransID'=> $purchase_res[$i]['epayTransID'],
									'transIdRes'	=> $purchase_res[$i]['epayTransID'],
									//'merchantID' 	=> $purchase_res[$i]['merchantID'],
									'errorCode' 	=> $purchase_res[$i]['errorCode'],
									'errorMessage' 	=> $purchase_res[$i]['errorMessage'],
									//card info
									'cardNumber'	=> $cardData_array["xcode"],
									'serialNumber' 	=> $cardData_array["xserial"],
									'cardData'		=> $cardData_array["x"],
									'amount'		=> $log_init['cardprice'], // nếu thành công mới save số tiền vào									
									//'cardType'		=> $purchase_res[$i]['providerName'],
									'expiryDate' 	=> $purchase_res[$i]['expiryDate'],									
									//
									'updated' 		=> date("Y-m-d H:i:s"),
									'statusDesc' 	=> "Thành công",
									'status' 		=> "1"
								);
							// update customer ID for user table
							$aUpdate	= array("epayStatus","partnerTransID","transIdRes","errorCode","errorMessage","cardNumber","serialNumber","expiryDate","cardData","amount","updated","statusDesc","status");
							$log3 			= $this->db_billing_model->insert_onduplicate_logbilling_update($aParamCardLog,$aUpdate); //ok
							$code 		= 1;
							$msgs[] 	= "Giao dịch thành công.";
							// E3.END SAVE LOG SUCCESS							
						}// end foreach
						// Nên trả về json, sau đó truyền qua ajax rồi xử lý tiếp					
						return json_encode($purchase_res);//exit;		
					}else{ // Epay trans ID info failed
						$purchase_res[1]['epayStatus']				= $result[1]['epayStatus']; // lấy mã thẻ thất bại. 
						$purchase_res[1]['epayTransID']				= $result[1]['epayTransID'];
						$purchase_res[1]['errorCode']				= $result[1]['errorCode'];
						$purchase_res[1]['errorMessage']			= $result[1]['errorMessage'];
						// E3.START SAVE LOG FAILED
						$aParamCardLog=array(
								'transID' 		=> $log_init['transID'],// key để biết được record sẽ updated
								'epayStatus' 	=> $purchase_res[1]['epayStatus'],
								'partnerTransID' => $purchase_res[1]['epayTransID'],
								'transIdRes' 	=> $purchase_res[1]['epayTransID'],
								'errorCode' 	=> $purchase_res[1]['errorCode'],
								'errorMessage' 	=> $purchase_res[1]['errorMessage'],
								'updated' 		=> date("Y-m-d H:i:s"),
								'statusDesc' 	=> "Thất bại",
								'status' 		=> "0"
							);
						// update customer ID for user table
						$aUpdate	= array("epayStatus","partnerTransID","transIdRes","errorCode","errorMessage","updated","statusDesc","status");
						$log3 			= $this->db_billing_model->insert_onduplicate_logbilling_update($aParamCardLog,$aUpdate); //ok
						// E3.END SAVE LOG FAILED
						$code 		= -1;
						$msgs[] 	= "Giao dịch thất bại. Vui lòng liên hệ bộ phận kỹ thuật.";
					} // End result					
					//print_r($purchase_res);exit;
					// 2. Gửi email cho user
				} catch (Exception $e) {
					//echo 'Caught exception: ',  $e->getMessage(), "\n";exit;
					$code 		= -1;
					$msgs[] 	= "Caught exception: .".$e->getMessage();
				}				
			}else{
				// không kết nối dc với hệ thống epay.
				//echo "Hệ thống đang bận hoặc bảo trì, vui lòng quay lại sau.E001.";exit;
				$code 		= -1;
				$msgs[] 	= "Hệ thống đang bận hoặc bảo trì, vui lòng quay lại sau.E001.";
			}// end kết quả sau khi đăng nhập			
		}// end check count msg
		foreach ($msgs as $m){
			$msg.="$m<br/>";			
		}
		$msg	= json_encode(array("code"=>$code,"msg"=>$msg));
		return $msg;//exit;
	}